package com.xiahui.day11.Test9;

/**
 * 人类
 *  什么是hashCode(哈希值) ？
 *      hash值是根据杂凑算法所计算出来的一个数值
 *      hash值并不是地址值 而是根据对象的地址等一些信息 使用杂凑算法所计算出来的一个十进制的数值
 *      Java中的地址值我们是无法获取的 计算hash值的方式也无法获取
 *  为什么要重写hashCode()方法？
 *      1.因为默认情况下 两个对象equals比较为true 则hashCode必须是相同的
 *      现在 我们重写了equals 改变了对象的比较规则 所以应当继续重写hashCode 以
 *      维持 ·两个对象equals比较为true 则hashCode必须是相同的· 这个规则
 *      2.在后续学习的集合类中 默认是以equals比较为true 并且hashCode相同作为去除重复元素的依据
 *
 *
 *
 */
public class Person {
    private String name;
    private String idCard;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public Person(String name, String idCard) {
        this.name = name;
        this.idCard = idCard;
    }

    public Person() {
    }

    public boolean equals(Object obj){
        if(this == obj){
            return true;
        }
        // 因为形参为Object类型的 而Object类中没有任何属性 所以不能直接访问 name  以及 idCard
        // 如需访问 必须 向下转型(强制类型转换)
        Person p1 = (Person)obj;
        // 如何确定调用的方法属于哪个类的方法？
        // 根据调用方法的对象 所属的类型来判断
        if(this.name.equals(p1.name) && this.idCard.equals(p1.idCard)){
            return true;
        }
        return false;
    }

    /**
     *  分析： 因为我们要保证在equals比较为true的情况下 两个对象hashCode相同
     *  又因为equals方法是根据人的名字和身份证号比较的
     *  所以我们也要根据人的名字和身份证号来计算hash值
     */
    public  int hashCode(){
        int result = 1; // 作为最终返回的结果
        int prime = 31; // 权重
        result = result * prime + (this.name == null ? 0 : this.name.hashCode());
        result = result * prime + (this.idCard == null ? 0 : this.idCard.hashCode());
        return result;
    }


    public static void main(String[] args) {
        Person p1 = new Person("赵四", "457892598532453");
        Person p2 = new Person("赵四", "457892598532453");


        System.out.println(p1 == p2); // false
        System.out.println(p1.equals(p2)); // false


        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());


    }


}
